#!/usr/bin/python
#coding=utf-8

import time,prop


from math import pow,sqrt,pi
import Hypercubes



from myyfun import f_lin_1

def f1(x):
    return 1






#основная функция f - интегранд,itmx - число итераций в каждом кубе, N1-число разбиений вдоль осей, M-число вызовов в кубе,n- размерность
def integrate(f,itx,N1,M):
    #массивы, хранящие интеграл по итерациям
    In_it=[]
    Di_it=[]
    #массив, определяющий границы области интегрирования
    A=((0,0,1.0),(1,0,1.0),(2,0,1.0))
    n=len(A)
    N=int(M*pow(N1,n))
    print "Число переменных интегрирования:", n
    print "Число итераций:", itx
    print "Разбиение: импульсы - углы - пар-ры растяжения\n"
    print A
    print "Начальное число гиперкубов:",int(pow(N1,n))
    print "Число точек интегрирования:",N
    print "Будет вызовов интегранда:",int(itx*M*pow(N1,n))
    print "-------------------------------------------------------------------"
    raw_input('Продолжить?')
    print "-------------------------------------------------------------------"
    Hyper=Hypercubes.Hyp_space(A,N1,M,n)
    it = 0
    Result_1=0.0
    Result_2=0.0
    res_1=0.0
    res_2=0.0

    while it < itx:
          it += 1
          print "Итерация №", it
          time.sleep(1)
          C=Hyper.integrio(f,n)
          (H,In,Di)=Hyper.rem_xor(1.0e-6)                          
          Result_1 += In
          Result_2 += Di
          In_it.append(Result_1+C[0])
          Di_it.append(Result_2+C[1])
          Hyper.pererasp_uni(N)
          res_1=C[0]
          res_2=C[1]         
          print "Интеграл равен",Result_1+C[0]
          print "Дисперсия равна",Result_2+C[1]                 
          Hyper.razbit(3.0e-6,1000,n,2) 
    print "-------------------------------------------------------------------"
    print "Итоговое значение:"
    print Result_1+res_1,"+-",sqrt(Result_2+res_2)
    print "Динамика интеграла по итерациям:"
    print In_it
    print "Усреднённое по итерациям значение:"
    print reduce(lambda x,y: x+y , In_it)/len(In_it)

integrate(f_lin_1,25,2,1000)  
#print prop.jack_p([2.0,2.0,2.0]);













 


